package AwsSES;


import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.simpleemail.AWSJavaMailTransport;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient;
import com.amazonaws.services.simpleemail.model.ListVerifiedEmailAddressesResult;
import com.amazonaws.services.simpleemail.model.VerifyEmailAddressRequest;
import java.io.IOException;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SimpleMailAws {

    /*
     * Importante: Não se esqueça de preencher o endereço de e-mail você que tem
     * acesso de modo que Você pode receber e-mail de confirmação inicial da
     * Amazon Simples Email Serviço.
     */
    private static final String TO = "bsmrio@gmail.com";
    private static final String FROM = "bruno.maria@delphos.com.br";
    private static final String BODY = "Teste de Envio de Email via Amazon SES " + new Date();
    private static final String SUBJECT = "Teste de Envio de Email via Amazon SES";
    public static final String ACCESS_KEY = "AKIAJICRH6ZVS7ENHQMA";
    public static final String SECRET_KEY = "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";

    public static void main(String[] args) throws IOException {
        /*
         * Esta implementação do provedor de credenciais carrega suas
         * credenciais AWS A partir de um arquivo de propriedades na raiz do seu
         * classpath. Importante: Certifique-se de preencher as suas credenciais
         * de acesso da AWS no AwsCredentials.properties arquivo antes de tentar
         * executar este exemplo. http://aws.amazon.com/security-credentials
         */

        AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
        //AWSCredentials credentials = new ClasspathPropertiesFileCredentialsProvider().getCredentials();
        AmazonSimpleEmailService ses = new AmazonSimpleEmailServiceClient(credentials);
        //Region usWest2 = Region.getRegion(Regions.US_WEST_2);
        //Region saoPaulo = Region.getRegion(Regions.EU_WEST_1);

        //ses.setRegion(saoPaulo);

        /*
         * Antes que você possa enviar e-mails via Amazon SES, você precisa
         * verificar se você Próprio o endereço de email que você?? Vou estar
         * enviando e-mail. Isso vai Disparar um e-mail de verificação, que irá
         * conter um link que você pode Clicar para completar o processo de
         * verificação.
         */
        //verifyEmailAddress(ses, FROM);

        /*
         * Se você só se inscreveu para a SES, então você vai ser colocado na
         * Amazônia SES sandbox, onde você também deve verificar os endereços de
         * e-mail que você quer Enviar e-mail para.
         *
         * Você pode remover o comentário da linha abaixo para verificar a
         * abordar neste Amostra.
         *
         * Uma vez que você tem acesso total a Amazon SES, você * não * ser
         * necessário Para verificar cada endereço de e-mail que você quer
         * enviar e-mail para.
         *
         * Você pode solicitar acesso completo a Amazon SES aqui:
         * http://aws.amazon.com/ses/fullaccessrequest
         */

        //verifyEmailAddress(ses, TO);


        /*
         * JavaMail configuração para usar o Amazon simples serviço de email,
         * especificando O protocolo "aws".
         */
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "aws");

        /*
         * Definir mail.aws.user e mail.aws.password são opcionais. fixação
         * Estes lhe permitirá enviar e-mails usando o transporte estática send
         * () Método de convencer. Ele também irá permitir que você chamar
         * connect () sem Parâmetros. Caso contrário, um nome de usuário e senha
         * devem ser especificados em Conectar.
         */
        props.setProperty("mail.aws.user", credentials.getAWSAccessKeyId());
        props.setProperty("mail.aws.password", credentials.getAWSSecretKey());

        Session session = Session.getInstance(props);

        try {

            // Cria uma nova mensagem
            Message msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(FROM));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(TO));
            msg.setSubject(SUBJECT);
            msg.setText(BODY);
            msg.saveChanges();

            // Reutilizar um objeto de transporte para o envio de todas as mensagens
            // Para um melhor desempenho
            Transport t = new AWSJavaMailTransport(session, null);
            t.connect();
            t.sendMessage(msg, null);
            
            // Fecha o seu transporte quando você está completamente feito o envio
            // Todas as suas mensagens
            t.close();
        } catch (AddressException e) {
            e.printStackTrace();
            System.out.println("Caught an AddressException, which means one or more of your "
                    + "addresses are improperly formatted.");
        } catch (MessagingException e) {
            e.printStackTrace();
            System.out.println("Caught a MessagingException, which means that there was a "
                    + "problem sending your message to Amazon's E-mail Service check the "
                    + "stack trace for more information.");
        }

    }

    /**
     * Envia um pedido para a Amazônia simples serviço de email para verificar o
     * especificado Endereço de e-mail. Isso desencadeia um e-mail de
     * verificação, que conterá um Link que você pode clicar para completar o
     * processo de verificação.
     *
     * @ Param ses O cliente do serviço de email simples Amazon para usar ao
     * fazer Pedidos a Amazon SES.
     * @ Param endereço O endereço de e-mail para verificar.
     */
    public static void verifyEmailAddress(AmazonSimpleEmailService ses, String address) {

        ListVerifiedEmailAddressesResult verifiedEmails = ses.listVerifiedEmailAddresses();
        
        if (verifiedEmails.getVerifiedEmailAddresses().contains(address)) {
            return;
        }

        ses.verifyEmailAddress(new VerifyEmailAddressRequest().withEmailAddress(address));
        System.out.println("Please check the email address " + address + " to verify it");
        System.exit(0);

    }
}